// MCP - NODE SDK
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";

// 导入 StdioServerTransport 类，用于处理服务器的输入输出通信
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { error } from "console";

// 导入用于验证输入参数的库
import { z } from "zod";

// Pixabay API URL
const baseURL = "https://pixabay.com/api/";

/**
 *  定义了 MCP Server 实例
*/
const server = new McpServer({
    name: "pixabay",
    version: "1.0.0",
    capabilities: {
        resources: {},
        tools: {},
    },
});

/**
 *  定义了一个名为 “pixabay-image-search” 的工具，
 *  该工具接受一个查询字符串和一个图像类型作为输入参数，
 *  并返回一个包含图像信息的 JSON 字符串。
*/
server.tool(
    "pixabay-image-search",
    {
        query: z.string(),
        type: z.string(),
    },
    async ({ query, type = 'all' }) => {
        try {
            // 检查是否设置了 PIXABAY_KEY 环境变量
            if (!process.env.PIXABAY_KEY) {
                console.error("PIXABAY_KEY environment variable is not set");
                process.exit(1);
            }
            console.log("PIXABAY_KEY", process.env.PIXABAY_KEY)

            // 构建 Pixabay API 请求 URL
            const requestUrl = `${baseURL}?key=${process.env.PIXABAY_KEY}&q=${query}&image_type=${type}&per_page=3`;

            // 发送请求并获取响应
            const response = await fetch(requestUrl);

            // 检查响应状态
            const json = await response.json();

            // 返回响应结果
            return {
                content: [{
                    type: "text",
                    text: JSON.stringify({
                        images: json.hits || [],
                        total_result: json.total,
                        query,
                    }, 
                    null, 
                    2
                ),
                },],
            };
        } catch (e) {
            return {
                content: [{
                    type: 'text',
                    text: `Error: ${e instanceof Error ? e.message : 'Unknown error'}`,
                }],
                isError: true,
            };
        }
    }
);

/**
 * 启动服务器并建立与传输层的连接。
 * 该函数创建一个标准输入输出的服务器传输实例，
 * 并使用该实例将服务器连接到传输层。
 */
async function startServer() {
    try {
        // 创建一个标准输入输出的服务器传输实例，用于处理服务器的输入输出通信
        const transport = new StdioServerTransport();
        // 等待服务器通过指定的传输实例建立连接
        await server.connect(transport);
        console.log('Server connected via stdio transport');
    } catch (error) {
        console.error('Failed to start server:', error);
        // process.exit(1); // 可选：失败时退出进程
        throw error; // 重新抛出错误，由外层统一处理
    }
}

// 启动服务器
startServer()
    .then(() => console.log('Server running'))
    .catch((error) => {
        console.error('Unhandled startup error:', error)
        process.exit(1);
});